package com.codejiwei.core.graphx

import org.apache.spark.SparkContext
import org.apache.spark.graphx.{Edge, Graph}

object GraphX_OuterJoinVertices {
  def main(args: Array[String]): Unit = {

    // 创建 SparkContext
    val sc = new SparkContext("local", "GraphOuterJoinVerticesExample")

    // 创建一个简单的图
    val vertices = sc.parallelize(Array((1L, "Alice"), (2L, "Bob"), (3L, "Charlie"), (4L, "David")))
    val edges = sc.parallelize(Array(
      Edge(1L, 2L, 3), // 边1: Alice -> Bob，权重为3
      Edge(1L, 2L, 2), // 边2: Alice -> Bob，权重为2
      Edge(1L, 3L, 1), // 边3: Alice -> Charlie，权重为1
      Edge(2L, 3L, 4), // 边4: Bob -> Charlie，权重为4
      Edge(3L, 4L, 5), // 边5: Charlie -> David，权重为5
      Edge(3L, 4L, 6) // 边6: Charlie -> David，权重为6
    ))

    val graph: Graph[String, Int] = Graph(vertices, edges, "default")

    // 创建另一个 RDD 用于连接
    val userData = sc.parallelize(Array((1L, 30), (2L, 35), (5L, 40)))

    // 使用 outerJoinVertices 方法将 userData 与图的顶点属性进行外连接，并通过 mapFunc 函数将连接后的数据映射到新图的顶点属性上
    val newGraph = graph.outerJoinVertices(userData) { (vid, attr, userDataAttr) =>
      // 将图的顶点属性和 userData 的数据进行合并，如果 userData 中不存在对应的数据，则使用默认值 None
      userDataAttr match {
        case Some(age) => s"$attr - Age: $age"
        case None => s"$attr - No age information available"
      }
    }

    // 输出新图的顶点
    println("Vertices in new graph:")
    newGraph.vertices.collect().foreach(println)



  }
}
